<!DOCTYPE html>
<html lang="zh-CN" dir="ltr">
  <head>
    <meta charset="utf-8">
    
    <title>404 | PureChat</title>
    <meta name="description" content="Not Found">
    <meta name="generator" content="VitePress v1.5.0">
    <link rel="preload stylesheet" href="/pure-docs/assets/style.B-qJtPzW.css" as="style">
    <link rel="preload stylesheet" href="/pure-docs/vp-icons.css" as="style">
    
    <script type="module" src="/pure-docs/assets/app.DI8KjbBl.js"></script>
    <link rel="preload" href="/pure-docs/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
    <link rel="icon" href="./favicon.ico">
    <meta name="keywords" content="purechat, purechat docs">
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
    <meta name="author" content="yongkang">
    <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
    <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
  </head>
  <body>
    <div id="app"></div>
    <script>window.__VP_HASH_MAP__=JSON.parse("{\"guides_model-provider.md\":\"4ffzDjc9\",\"guides_model.md\":\"DQ2sj402\",\"guides_olama-usage.md\":\"DDohLdvc\",\"guides_ollama.md\":\"Bsqr0ClO\",\"guides_prompts.md\":\"hnXtj2Et\",\"index.md\":\"BBU3yXVP\",\"other_deploy.md\":\"DmWNz-Or\",\"other_faq.md\":\"Ywgj2uM8\",\"other_logs.md\":\"CCKpqmUz\",\"other_recommendation.md\":\"Cln7myX3\",\"preface_commitlint.md\":\"WcuBSsQq\",\"preface_config.md\":\"CppkE-QF\",\"preface_directory.md\":\"CkrlRqr3\",\"preface_index.md\":\"Dg9pqRBm\",\"preface_start.md\":\"5ElgGXQN\"}");function deserializeFunctions(r){return Array.isArray(r)?r.map(deserializeFunctions):typeof r=="object"&&r!==null?Object.keys(r).reduce((t,n)=>(t[n]=deserializeFunctions(r[n]),t),{}):typeof r=="string"&&r.startsWith("_vp-fn_")?new Function(`return ${r.slice(7)}`)():r};window.__VP_SITE_DATA__=deserializeFunctions(JSON.parse("{\"lang\":\"zh-CN\",\"dir\":\"ltr\",\"title\":\"PureChat\",\"description\":\"PureChat文档\",\"base\":\"/pure-docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"editLink\":{\"pattern\":\"https://github.com/Hyk260/pure-docs/edit/main/src/:path\",\"text\":\"为此页提供修改建议\"},\"outline\":{\"label\":\"本页目录\",\"level\":[2,3]},\"lastUpdated\":{\"text\":\"上次更新\",\"formatOptions\":{\"dateStyle\":\"full\",\"timeStyle\":\"medium\"}},\"cleanUrls\":true,\"ignoreDeadLinks\":[{},{},{}],\"markdown\":{\"config\":\"_vp-fn_function(md) {\\n        md.use(groupIconMdPlugin);\\n      }\",\"codeTransformers\":[{\"preprocess\":\"_vp-fn_function(code, options2) {\\n      const cleanup = options2.transformers?.find((i) => i.name === \\\"vitepress:clean-up\\\");\\n      if (cleanup)\\n        options2.transformers?.splice(options2.transformers.indexOf(cleanup), 1);\\n      if (!explicitTrigger || options2.meta?.__raw?.match(trigger)) {\\n        const vPre = options2.transformers?.find((i) => i.name === \\\"vitepress:v-pre\\\");\\n        if (vPre)\\n          options2.transformers?.splice(options2.transformers.indexOf(vPre), 1);\\n      }\\n      return twoslash.preprocess.call(this, code, options2);\\n    }\",\"tokens\":\"_vp-fn_function(tokens) {\\n        const twoslash = map.get(this.meta);\\n        if (!twoslash)\\n          return;\\n        return splitTokens(\\n          tokens,\\n          twoslash.nodes.flatMap(\\n            (i) => [\\\"hover\\\", \\\"error\\\", \\\"query\\\", \\\"highlight\\\", \\\"completion\\\"].includes(i.type) ? [i.start, i.start + i.length] : []\\n          )\\n        );\\n      }\",\"pre\":\"_vp-fn_function(pre) {\\n        const twoslash = map.get(this.meta);\\n        if (!twoslash)\\n          return;\\n        this.addClassToHast(pre, \\\"twoslash lsp\\\");\\n      }\",\"code\":\"_vp-fn_function(codeEl) {\\n        const twoslash = map.get(this.meta);\\n        if (!twoslash)\\n          return;\\n        const insertAfterLine = (line, nodes) => {\\n          if (!nodes.length)\\n            return;\\n          let index;\\n          if (line >= this.lines.length) {\\n            index = codeEl.children.length;\\n          } else {\\n            const lineEl = this.lines[line];\\n            index = codeEl.children.indexOf(lineEl);\\n            if (index === -1) {\\n              onShikiError(new ShikiTwoslashError(`Cannot find line ${line} in code element`), this.source, this.options.lang);\\n              return;\\n            }\\n          }\\n          const nodeAfter = codeEl.children[index + 1];\\n          if (nodeAfter && nodeAfter.type === \\\"text\\\" && nodeAfter.value === \\\"\\\\n\\\")\\n            codeEl.children.splice(index + 1, 1);\\n          codeEl.children.splice(index + 1, 0, ...nodes);\\n        };\\n        const tokensMap = [];\\n        this.lines.forEach((lineEl, line) => {\\n          let index = 0;\\n          for (const token of lineEl.children.flatMap((i) => i.type === \\\"element\\\" ? i.children || [] : [])) {\\n            if (\\\"value\\\" in token && typeof token.value === \\\"string\\\") {\\n              tokensMap.push([line, index, index + token.value.length, token]);\\n              index += token.value.length;\\n            }\\n          }\\n        });\\n        const locateTextTokens = (line, character, length) => {\\n          const start = character;\\n          const end = character + length;\\n          if (length === 0) {\\n            return tokensMap.filter(([l, s, e]) => l === line && s < start && start <= e).map((i) => i[3]);\\n          }\\n          return tokensMap.filter(([l, s, e]) => l === line && (start <= s && s < end) && (start < e && e <= end)).map((i) => i[3]);\\n        };\\n        const tokensSkipHover = /* @__PURE__ */ new Set();\\n        const actionsHovers = [];\\n        const actionsHighlights = [];\\n        for (const node of twoslash.nodes) {\\n          if (node.type === \\\"tag\\\") {\\n            if (renderer.lineCustomTag)\\n              insertAfterLine(node.line, renderer.lineCustomTag.call(this, node));\\n            continue;\\n          }\\n          const tokens = locateTextTokens(node.line, node.character, node.length);\\n          if (!tokens.length && !(node.type === \\\"error\\\" && renderer.nodesError)) {\\n            onShikiError(new ShikiTwoslashError(`Cannot find tokens for node: ${JSON.stringify(node)}`), this.source, this.options.lang);\\n            continue;\\n          }\\n          const wrapTokens = (fn) => {\\n            const line = this.lines[node.line];\\n            let charIndex = 0;\\n            let itemStart = line.children.length;\\n            let itemEnd = 0;\\n            line.children.forEach((token, index) => {\\n              if (charIndex >= node.character && index < itemStart)\\n                itemStart = index;\\n              if (charIndex <= node.character + node.length && index > itemEnd)\\n                itemEnd = index;\\n              charIndex += getTokenString(token).length;\\n            });\\n            if (charIndex <= node.character + node.length)\\n              itemEnd = line.children.length;\\n            const targets = line.children.slice(itemStart, itemEnd);\\n            const length = targets.length;\\n            line.children.splice(itemStart, length, ...fn(targets));\\n          };\\n          switch (node.type) {\\n            case \\\"error\\\": {\\n              if (renderer.nodeError) {\\n                tokens.forEach((token) => {\\n                  tokensSkipHover.add(token);\\n                  const clone = { ...token };\\n                  Object.assign(token, renderer.nodeError.call(this, node, clone));\\n                });\\n              }\\n              if (renderer.nodesError) {\\n                tokens.forEach((token) => {\\n                  tokensSkipHover.add(token);\\n                });\\n                actionsHighlights.push(() => {\\n                  wrapTokens((targets) => renderer.nodesError?.call(this, node, targets) || targets);\\n                });\\n              }\\n              if (renderer.lineError)\\n                insertAfterLine(node.line, renderer.lineError.call(this, node));\\n              break;\\n            }\\n            case \\\"query\\\": {\\n              const token = tokens[0];\\n              if (token && renderer.nodeQuery) {\\n                tokensSkipHover.add(token);\\n                const clone = { ...token };\\n                Object.assign(token, renderer.nodeQuery.call(this, node, clone));\\n              }\\n              if (renderer.lineQuery)\\n                insertAfterLine(node.line, renderer.lineQuery.call(this, node, token));\\n              break;\\n            }\\n            case \\\"completion\\\": {\\n              if (renderer.nodeCompletion) {\\n                tokens.forEach((token) => {\\n                  tokensSkipHover.add(token);\\n                  const clone = { ...token };\\n                  Object.assign(token, renderer.nodeCompletion.call(this, node, clone));\\n                });\\n              }\\n              if (renderer.lineCompletion)\\n                insertAfterLine(node.line, renderer.lineCompletion.call(this, node));\\n              break;\\n            }\\n            case \\\"highlight\\\": {\\n              if (renderer.nodesHighlight) {\\n                actionsHighlights.push(() => {\\n                  wrapTokens((targets) => renderer.nodesHighlight?.call(this, node, targets) || targets);\\n                });\\n              }\\n              break;\\n            }\\n            case \\\"hover\\\": {\\n              if (renderer.nodeStaticInfo) {\\n                actionsHovers.push(() => {\\n                  tokens.forEach((token) => {\\n                    if (tokensSkipHover.has(token))\\n                      return;\\n                    tokensSkipHover.add(token);\\n                    const clone = { ...token };\\n                    Object.assign(token, renderer.nodeStaticInfo.call(this, node, clone));\\n                  });\\n                });\\n              }\\n              break;\\n            }\\n            default: {\\n              onShikiError(new ShikiTwoslashError(`Unknown node type: ${node?.type}`), this.source, this.options.lang);\\n            }\\n          }\\n        }\\n        actionsHovers.forEach((i) => i());\\n        actionsHighlights.forEach((i) => i());\\n      }\",\"name\":\"@shikijs/vitepress-twoslash\",\"postprocess\":\"_vp-fn_function(html) {\\n      if (this.meta.twoslash)\\n        return html.replace(/\\\\{/g, \\\"&#123;\\\");\\n    }\"}],\"theme\":{\"light\":\"vitesse-light\",\"dark\":\"vitesse-dark\"}},\"transformPageData\":\"_vp-fn_function(pageData) {\\n      const canonicalUrl = `${ogUrl}/${pageData.relativePath}`.replace(/\\\\/index\\\\.md$/, \\\"/\\\").replace(/\\\\.md$/, \\\"/\\\");\\n      pageData.frontmatter.head ??= [];\\n      pageData.frontmatter.head.unshift(\\n        [\\\"link\\\", { rel: \\\"canonical\\\", href: canonicalUrl }],\\n        [\\\"meta\\\", { property: \\\"og:title\\\", content: pageData.title }]\\n      );\\n      return pageData;\\n    }\",\"logo\":\"/favicon.png\",\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/Hyk260/PureChat\"},{\"icon\":{\"svg\":\"\\n<svg height=\\\"2500\\\" viewBox=\\\"-1.94 0 124.879 145.085\\\" width=\\\"2101\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n\\t<path\\n\\t\\td=\\\"m60.503 142.237c-12.533 0-24.038-4.195-31.445-10.46-3.762 1.124-8.574 2.932-11.61 5.175-2.6 1.918-2.275 3.874-1.807 4.663 2.056 3.47 35.273 2.216 44.862 1.136zm0 0c12.535 0 24.039-4.195 31.447-10.46 3.76 1.124 8.573 2.932 11.61 5.175 2.598 1.918 2.274 3.874 1.805 4.663-2.056 3.47-35.272 2.216-44.862 1.136zm0 0\\\"\\n\\t\\tfill=\\\"#faab07\\\"\\n\\t/>\\n\\t<path\\n\\t\\td=\\\"m60.576 67.119c20.698-.14 37.286-4.147 42.907-5.683 1.34-.367 2.056-1.024 2.056-1.024.005-.189.085-3.37.085-5.01 0-27.634-13.044-55.401-45.124-55.402-32.08.001-45.125 27.769-45.125 55.401 0 1.642.08 4.822.086 5.01 0 0 .583.615 1.65.913 5.19 1.444 22.09 5.65 43.312 5.795zm56.245 23.02c-1.283-4.129-3.034-8.944-4.808-13.568 0 0-1.02-.126-1.537.023-15.913 4.623-35.202 7.57-49.9 7.392h-.153c-14.616.175-33.774-2.737-49.634-7.315-.606-.175-1.802-.1-1.802-.1-1.774 4.624-3.525 9.44-4.808 13.568-6.119 19.69-4.136 27.838-2.627 28.02 3.239.392 12.606-14.821 12.606-14.821 0 15.459 13.957 39.195 45.918 39.413h.848c31.96-.218 45.917-23.954 45.917-39.413 0 0 9.368 15.213 12.607 14.822 1.508-.183 3.491-8.332-2.627-28.021\\\"\\n\\t/>\\n\\t<path\\n\\t\\td=\\\"m49.085 40.824c-4.352.197-8.07-4.76-8.304-11.063-.236-6.305 3.098-11.576 7.45-11.773 4.347-.195 8.064 4.76 8.3 11.065.238 6.306-3.097 11.577-7.446 11.771m31.133-11.063c-.233 6.302-3.951 11.26-8.303 11.063-4.35-.195-7.684-5.465-7.446-11.77.236-6.305 3.952-11.26 8.3-11.066 4.352.197 7.686 5.468 7.449 11.773\\\"\\n\\t\\tfill=\\\"#fff\\\"\\n\\t/>\\n\\t<path\\n\\t\\td=\\\"m87.952 49.725c-1.162-2.575-12.875-5.445-27.374-5.445h-.156c-14.5 0-26.212 2.87-27.375 5.446a.863.863 0 0 0 -.085.367c0 .186.063.352.16.496.98 1.427 13.985 8.487 27.3 8.487h.156c13.314 0 26.319-7.058 27.299-8.487a.873.873 0 0 0 .16-.498.856.856 0 0 0 -.085-.365\\\"\\n\\t\\tfill=\\\"#faab07\\\"\\n\\t/>\\n\\t<path\\n\\t\\td=\\\"m54.434 29.854c.199 2.49-1.167 4.702-3.046 4.943-1.883.242-3.568-1.58-3.768-4.07-.197-2.492 1.167-4.704 3.043-4.944 1.886-.244 3.574 1.58 3.771 4.07m11.956.833c.385-.689 3.004-4.312 8.427-2.993 1.425.347 2.084.857 2.223 1.057.205.296.262.718.053 1.286-.412 1.126-1.263 1.095-1.734.875-.305-.142-4.082-2.66-7.562 1.097-.24.257-.668.346-1.073.04-.407-.308-.574-.93-.334-1.362\\\"\\n\\t/>\\n\\t<path\\n\\t\\td=\\\"m60.576 83.08h-.153c-9.996.12-22.116-1.204-33.854-3.518-1.004 5.818-1.61 13.132-1.09 21.853 1.316 22.043 14.407 35.9 34.614 36.1h.82c20.208-.2 33.298-14.057 34.616-36.1.52-8.723-.087-16.035-1.092-21.854-11.739 2.315-23.862 3.64-33.86 3.518\\\"\\n\\t\\tfill=\\\"#fff\\\"\\n\\t/>\\n\\t<g fill=\\\"#eb1923\\\">\\n\\t\\t<path d=\\\"m32.102 81.235v21.693s9.937 2.004 19.893.616v-20.009c-6.307-.357-13.109-1.152-19.893-2.3\\\" />\\n\\t\\t<path\\n\\t\\t\\td=\\\"m105.539 60.412s-19.33 6.102-44.963 6.275h-.153c-25.591-.172-44.896-6.255-44.962-6.275l-6.474 16.158c16.193 4.882 36.261 8.028 51.436 7.845h.153c15.175.183 35.242-2.963 51.437-7.845zm0 0\\\"\\n\\t\\t/>\\n\\t</g>\\n</svg>\"},\"link\":\"https://jq.qq.com/?_wv=1027&k=Cd4Ihd2J\"}],\"nav\":[{\"text\":\"介绍\",\"link\":\"/preface/\"},{\"text\":\"常见问题\",\"link\":\"/other/FAQ\"},{\"text\":\"更新日志\",\"link\":\"/other/logs\"},{\"text\":\"链接\",\"items\":[{\"text\":\"在线预览\",\"link\":\"https://purechat.cn\"},{\"text\":\"后端地址\",\"link\":\"https://github.com/Hyk260/pure-backend\"},{\"text\":\"Electron\",\"link\":\"https://github.com/Hyk260/PureChat/releases\"},{\"text\":\"gitee仓库\",\"link\":\"https://gitee.com/H260788/PureChat\"},{\"text\":\"github仓库\",\"link\":\"https://github.com/Hyk260/PureChat\"}]}],\"sidebar\":[{\"text\":\"前言\",\"items\":[{\"text\":\"介绍\",\"link\":\"/preface/\"},{\"text\":\"快速上手\",\"link\":\"/preface/start\"},{\"text\":\"项目配置\",\"link\":\"/preface/config\"},{\"text\":\"目录结构\",\"link\":\"/preface/directory\"},{\"text\":\"提交规范\",\"link\":\"/preface/commitlint\"}]},{\"text\":\"其他\",\"items\":[{\"text\":\"技术网站\",\"link\":\"/other/recommendation\"},{\"text\":\"常见问题\",\"link\":\"/other/FAQ\"},{\"text\":\"更新日志\",\"link\":\"/other/logs\"},{\"text\":\"私有化部署\",\"link\":\"/other/deploy\"}]},{\"text\":\"AI指南\",\"items\":[{\"text\":\"大语言模型指南\",\"link\":\"/guides/model\"},{\"text\":\"提示词指南\",\"link\":\"/guides/prompts\"},{\"text\":\"模型服务商\",\"link\":\"/guides/model-provider\"},{\"text\":\"Ollama集成\",\"link\":\"/guides/ollama\"},{\"text\":\"Ollama使用\",\"link\":\"/guides/olama-usage\"}]}],\"footer\":{\"message\":\"Released under the MIT License.\",\"copyright\":\"Copyright (c) 2023 yongkang\"},\"search\":{\"provider\":\"local\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}"));</script>
    
  </body>
</html>